/**
 * 
 */
package general;

import java.util.Vector;

/**
 * cette classe contient les differentes caracteristique issues des calculs des  differents critères
 * profondeur, periodicité, probabilité et url
 * ces resultats sont stockés dans une structure extensible pour l'ajoute eventuel de critères
 * @author denis
 *@version 1.0
 */


public class Point {

	private Vector<Vector<Float>> point;

	private Vector<Float> criteresDCT;
	private Vector<Float> critereDepth;
	private Vector<Float> criteresTagP;
	private Vector<Float> criteresURL;



	/**
	 * @param p1 un des points du couple de point dont on veut calculer la distance
	 * @param p2 un des points du couple de point dont on veut calculer la distance
	 * @return distance entre 2 points
	 */
	public static double distance(Point p1,Point p2){
		// TODO distanceEuclidienne calculer la distance entre 2 points de facon euclidienne

		double distance = 0;

		for(int i = 0; i < p1.getPoint().size();i++){//boucle sur les criteres
			double somme=0;
			for(int j = 0; j < p1.getPoint().get(i).size();j++){//boucles sur la taille de chaque critere
				somme+= Math.pow((p1.getPoint().get(i).get(j) - p2.getPoint().get(i).get(j)),2);
			}
			somme = somme/p1.getPoint().get(i).size();//on normalise chaque composante pour ne pas influer sur les poids
			distance+=somme;
		}
		distance = Math.sqrt(distance);

		return distance;
	}

	/**
	 * constructeur classique
	 */
	public Point() {
		// TODO Point() : tester et finir le constructeur
		//remplie les vecteurs avec des valeurs par defaut
		
		
	
//		Vector<Float> vecteurInitialisation = new Vector<Float>();
//		for(int i=0;i<4;i++){
//			vecteurInitialisation.add(i, (float) 0.0);
//		}
//		Vector<Vector<Float>> vecteurPoint = new Vector<Vector<Float>>();
//		for(int i=0;i<4;i++){
//			vecteurPoint.add(i,vecteurInitialisation);
//		}
		

		this.critereDepth = new Vector<Float>();
		this.criteresDCT = new Vector<Float>();
		this.criteresTagP = new Vector<Float>();
		this.criteresURL = new Vector<Float>();
		
		
		for(int i=0;i<4;i++){
			critereDepth.add( (float) 0.0);
		}
		for(int i=0;i<4;i++){
			criteresDCT.add( (float) 0.0);
		}
		for(int i=0;i<4;i++){
			criteresTagP.add( (float) 0.0);
		}
		for(int i=0;i<4;i++){
			criteresURL.add( (float) 0.0);
		}
		
		this.majPoint();
		
	
		
	}
	
	/**
	 * fonction de mise a zero d'un point
	 */
	
	public void miseAZero(){
		for(int i = 0; i < point.size(); i++)
		{
			for(int j = 0; j < point.get(i).size(); j++)
			{
				point.get(i).set(j, (float) 0); 
			}
		}
	}

	/**
	 * @return the point
	 */
	public Vector<Vector<Float>> getPoint() {
		return this.point;
	}

	/**
	 * @param point the point to set
	 */
	public void setPoint(Vector<Vector<Float>> point) {
		this.point = point;
	}

	/**
	 * @return the critereDepth
	 */
	public Vector<Float> getCritereDepth() {
		return this.critereDepth;
	}

	
	
	/**
	 * Mets a jour l'attribut point en fonction des differents criteres
	 */
	private void majPoint(){
		this.point = new Vector <Vector <Float>>();
		this.point.add(critereDepth);
		this.point.add(criteresDCT);
		this.point.add(criteresTagP);
		this.point.add(criteresURL);
		return;
	}
	
	
	/**
	 * @param critereDepth the critereDepth to set
	 */
	public void setCritereDepth(Vector<Float> depth) {
		this.critereDepth = depth;
		this.majPoint();
	}

	
	
	/**
	 * @return the criteresTagP
	 */
	public Vector<Float> getCriteresTagP() {
		return this.criteresTagP;
	}

	/**
	 * @param criteresTagP the criteresTagP to set
	 */
	public void setCriteresTagP(Vector<Float> criteresTagP) {
		this.criteresTagP = criteresTagP;
		this.majPoint();
	}

	/**
	 * @return the criteresDCT
	 */
	public Vector<Float> getCriteresDCT() {
		return this.criteresDCT;
	}

	/**
	 * @param criteresDCT the criteresDCT to set
	 */
	public void setCriteresDCT(Vector<Float> criteresDCT) {
		this.criteresDCT = criteresDCT;
		this.majPoint();
	}

	/**
	 * @return the criteresURL
	 */
	public Vector<Float> getCriteresURL() {
		return this.criteresURL;
	}

	/**
	 * @param criteresURL the criteresURL to set
	 */
	public void setCriteresURL(Vector<Float> criteresURL) {
		this.criteresURL = criteresURL;
		this.majPoint();
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "Point [critereDepth=" + this.critereDepth + ", criteresDCT="
				+ this.criteresDCT + ", criteresTagP=" + this.criteresTagP
				+ ", criteresURL=" + this.criteresURL + ", point=" + this.point
				+ "]";
	}

}
